package redes;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayDeque;
import java.util.LinkedList;

import networkproject.Layer;
import enlace.Enlace;

public class Rede extends Layer {
    String origem;
    String tabela[][];
    Enlace d;
    public Estado estado;
    String destino;
    LinkedList<Layer> camadas;
    int count = 0;
    
    public Rede(){
        super();
    }
    
    public Rede(byte ipOrigem, byte ipDestino){
        super("Rede");
        destino = ipDestino+"";
        origem = ipOrigem+"";
        
        try {
            BufferedReader br = new BufferedReader(new FileReader("C:\\"+ipOrigem+".txt"));
            
            if(br.readLine().equals("cliente")) {
            	System.out.println("ipOrigem = " + ipOrigem + "  ipDestino= " + ipDestino + "  cliente");
                estado = new EstadoCliente(d, layerUP, br);
            }
            else {
            	System.out.println("ipOrigem = " + ipOrigem + "  ipDestino= " + ipDestino + "Gateway");
                estado = new EstadoGateway(d, layerUP, br);
            }
        }
        catch(FileNotFoundException fnfe) {
            fnfe.printStackTrace();
            System.exit(1);
        }
        catch(IOException ioe) {
            ioe.printStackTrace();
            System.exit(1);
        }
        camadas = new LinkedList<Layer>();
        System.out.println("mac origem "+estado.mac);
        
        d = new Enlace((byte)estado.mac);
        setEnlace(d);
        this.layerDOWN = d;
        this.layerDOWN.setLayerUP(this);
        this.layerDOWN.start();
        
    }
    
    public void setCamadaCima(Layer L){
    	estado.setCamadaCima(L);
    }
    
    public void send(ArrayDeque<Byte> mensagem) {
    	
    	System.out.println("Rede.send");
        sentMessages.addLast(mensagem);
        System.out.println("sendMessageREDE1: "+sentMessages);
        System.out.println("Mensagem "+ mensagem);
        semaphoreSend.release();
        System.out.println("send; " + count++);
    	//sendMessage();
    }

    synchronized protected void sendMessage() {
    	ArrayDeque<Byte> d1 = sentMessages.removeFirst();
    	System.out.println("dest ip ou mac "+destino);
        Byte b = Byte.parseByte(destino);
        d1.addFirst(b);
        d1.addFirst(Byte.parseByte(origem));
        estado.envia(d1, b);
        
    }
    

    synchronized protected void receiveMessage() {
  
    	//System.out.println("PILHA: "+receivedMessages);
        estado.recebe(receivedMessages.removeFirst());
     }
    
    public void setEnlace(Enlace e){
    	System.out.println("Rede.setEnlace");
    	camadas.add(e);
    	
    	if (estado instanceof EstadoCliente) {
    		((EstadoCliente)estado).camadaBaixo = e;
    	}
    	else {
    		((EstadoGateway)estado).enlaces.add(e);
    	}
    }
    
    public void setUp(Layer c){
        layerUP = c;
        estado.camadaCima = c;
    }

	public String getOrigem() {
		return origem;
	}

}
